1 INTRODUCTION:

After eighteen months of recession, the longest since the Great Depression of the 1930’s, growth returned to the U.S economy in the summer of 2009. The recession may now be officially over, but its effects live on the form of unemployment, a host oof associated labor problems, and the on-going threat of double dip recession even in 2019. The great recession has transformed the social an economic life of the country. Today, most economists believe the Great Recession of 2007-2009 superseded the 1973-1975 recession in intensity. After 2011, the economy started to grow where companies hired again, consumers started spending, and businesses started to invest. That doesn’t mean everyone has gotten their jobs back or businesses are investing more than before the recession. It just means a country’s overall economy is expanding or growing on a somewhat more consistent basis.

Reference: 1.The great recession by David B. Grusky, Bruce Western 2.https://www.cnbc.com/id/43563081

2 CAUSE OF RECESSION:

2.1 Subprime mortgage crisis(2006) :

The first signs of the Great Recession started in 2006 when housing prices began falling. In 2006, the subprime mortgage crisis erupted. On November 17, 2006, the Commerce Department warned that October’s new home permits were 28 percent lower than the year before. At this point, the mortgage crisis could have been prevented. But the Bush administration and the Federal Reserve did not realize how grave those early warning signs were. They ignored declines in the inverted yield curve. Instead, they thought the strong money supply and low-interest rates would restrict any problems to the real estate industry. These interest-only loans were offered to subprime borrowers. These high-risk people are most likely to default on a loan. The banks offered them low interest rates. But this “too-good-to-be-true” loan type resets to a much higher rate after a certain period. Home prices fell at the same time interest rates reset. Their defaults caused the subprime mortgage crisis.

library(readxl)
Home_price <- read_excel("~/Data source/sq feet price of one family homes.xlsx")
View(Home_price)
qplot(data = Home_price,x=Year,y=median_price_per_squarefeet)+
  geom_line(size = 1, color = "black")+
  geom_text(aes(x= Year ,y= median_price_per_squarefeet, label= Year ))+
  labs(title = "SUBPRIME MORTAGE CRISIS \n Home prices started to decline in 2006",
       subtitle = "(2004-2010)",
       caption = "Data from the FRED",
       tag = "figure 1",
       x = "Year",
       y = "  \nmedian_price_per_squarefeet")+
  theme_economist()

Banks had sold too many mortgage-backed securities than what could be supported by good mortgages. That summer, Standard and Poor’s and Moody’s credit ratings services both announced their intention to reduce the ratings on more than 100 bonds backed by second-lien subprime mortgages. Standard and Poor’s also placed more than 600 securities backed by subprime residential mortgages on “credit watch”. By then, as the subprime crisis continued, housing prices across the country began to fall, due to a glut of new homes on the market, so millions of homeowners and their mortgage lenders were suddenly “underwater,” meaning their homes were valued less than their total loan amounts. In August 2007, the Federal Reserve responded to the subprime mortgage crisis by adding $24 billion in liquidity to the banking system.By the end of 2006, Many people started selling their home and the homeowners rate declined

homeownership_rate_2_ <- read_excel("~/Data source/homeownership rate (2).xls")
View(homeownership_rate_2_)
ggplot(homeownership_rate_2_)+aes(x=observation_year, y=homeownership_rate) + 
  geom_text(aes(x= observation_year,y=homeownership_rate , label=  observation_year, size = 3))+
  labs(title = "SUBPRIME MORTAGE CRISIS \nHome owners rate started to decline in 2006",
       subtitle = "(2004-2018)",
       caption = "Data from the FRED",
       tag = "figure 2",
       x = "observation_year",
       y = "  \nHomeownership_Rate")+
  geom_line(linetype='dashed', color='Darkgreen', size=1.2)+
  geom_point(color='deeppink3', alpha= 1)+
  theme_economist_white()

3 DURING RECESSION (Dec 2007 - June 2009 ):

3.1 Fed lowered interest rates :

On April 17, 2007, the Federal Reserve announced that the federal financial regulatory agencies that oversee lenders would encourage them to work with lenders to work out loan arrangements rather than foreclose. Alternatives to foreclosure include converting the loan to a fixed-rate mortgage, and receiving credit counseling through the Center for Foreclosure Solutions. Banks that worked with borrowers in low-income areas could also receive Community Reinvestment Act benefits.

In September, the Fed began lowering interest rates. Interest rates were at 5.25 percent in September 2007. But the Fed didn’t drop rates far enough, or fast enough, to calm markets. By the end of 2008, the Fed had reduced the target interest rate to zero percent for the first time in history in hopes of once again encouraging borrowing and, by extension, capital investment.

3.2 Stock Market crash :

On October 9 2007, the U.S. stock market reached its all-time high, as the key Dow Jones Industrial Average exceeded 14,000 for the first time in history. On September 29, 2008, the stock market crashed. The Dow Jones Industrial Average fell 777.68 points in intra-day trading. Over the next 18 months, the Dow lost more than half its value, falling to 6,547 points. Although a stock market crash can cause a recession, in this case it had already begun. But the crash of 2008 made a bad situation much, much worse.

dow_jones <- read_excel("~/Data source/dow jones.xlsx")
View(dow_jones)
p<- ggplot(dow_jones, aes(Year, Average_closing_by_year))+
  geom_line(size=1, color = "Brown")+
  geom_text(aes(x= Year ,y= Average_closing_by_year, label= Year , size = 5))+
  geom_point(aes(colour = Year))+
  labs(title = "STOCK MARKET CRASH \nEffect of recession on Dow Jones average closing by year",
       subtitle = "(2005-2019)",
       caption = "Data from the FRED",
       tag = "figure 4",
       x = "Year",
       y = "Average closing by year")+
  theme_calc()
ggplotly(p)

3.3 Drop in Dollar value :

library(readxl)
us_dollar_index_historical_chart <- read_excel("~/Data source/us-dollar-index-historical-chart.xlsx")
View(us_dollar_index_historical_chart)
p<- ggplot(us_dollar_index_historical_chart, aes(Date, value))+
  geom_line(size=1, color = "red")+
  labs(title = "DROP IN DOLLAR VALUE",
       subtitle = "(2005-2019)",
       caption = "Data from the FRED",
       tag = "figure 4",
       x = "Year",
       y = "Dollar value")+
  theme_gray()
ggplotly(p)

3.4 Bank Failures:

The banking crisis that ensued spelled the demise of hundreds of institutions: From 2008 through 2015, more than 500 banks failed, according to Federal Deposit Insurance Corporation (FDIC) data. In contrast, in the 7 years that preceded the recession, 25 banks failed.During and immediately after the Great Recession, US bank failures ballooned, spiking to roughly 150 in both 2009 and 2010. Since 2015, bank failures??? have fallen to single-digit numbers.

#bank failures by year
library(readr)
bank_failures <- read_csv("~/Data source/bank failures.csv")

Parsed with column specification: cols( MERGERS = col_double(), PAID_OFF = col_double(), STNAME = col_character(), YEAR = col_double() )

bank_failures = mutate(bank_failures, Number_of_failures= MERGERS + PAID_OFF)
view(bank_failures)

x must either be a summarytools object created with freq(), descr(), or a list of summarytools objects created using by()

plot_ly(data = bank_failures, x = ~YEAR, y = ~Number_of_failures, type = 'scatter', mode = 'lines')%>%
  layout(title = "COMMERCIAL BANK FAILURES BY YEAR",
         xaxis = list(title = "YEAR"),
         yaxis = list (title = "NUMBER OF BANK FAILURES"))

NA
library(readxl)
bank_failures_in_years <- read_excel("~/Data source/bank failures in years.xlsx")
View(bank_failures_in_years)
j<-ggplot(bank_failures_in_years) +
  geom_col(aes(x = factor(Year), y = Bank_failures, fill=factor(Total_assets_in_Millions)))+
  labs(title = "Bank failures by year with total asserts indicated on color")
ggplotly(j)

4 EFFECT OF RECESSION ON ECONOMIC FACTORS:

4.1 Effect of recession on “Employment” :

Job losers are workers who permanently lost a (stable or temporary) job in the last few years and who are currently unemployed or out of the labour force. Job losers are examined as a stock, whose demographic characteristics are identified, together with the last job held and the length of time without a job. Around 9956 people lost the job at the end of recession by september 2009.

library(readxl)
job_loosers <- read_excel("~/Data source/job loosers.xls")
View(job_loosers)
C <-ggplot(job_loosers, aes(observation_date,job_losers))+
  geom_point(aes(colour = observation_date))+
  geom_smooth(se= FALSE)+
  labs(title = "EFFECT OF RECESSION ON EMPLOYMENT", x= "OBSERVATION YEAR",y="JOB LOSERS IN THOUSANDS", colour="year",
       subtitle = "(2005-2014)",
       caption = "Data from the FRED",
       x = "Observation year",
       y = "Job losers in thousands")+
  theme_bw()
ggplotly(C)

geom_smooth() using method = ‘loess’ and formula ‘y ~ x’

The unemployment rate is the share of the labor force that is jobless, expressed as a percentage. It is a lagging indicator, meaning that it generally rises or falls in the wake of changing economic conditions, rather than anticipating them. When the economy is in poor shape and jobs are scarce, the unemployment rate can be expected to rise. When the economy is growing at a healthy rate and jobs are relatively plentiful, it can be expected to fall. In the year 2010, Unemployment rate reached 9.6

library(readxl)
UNRATE <- read_excel("~/Data source/UNRATE.xls")
View(UNRATE)
qplot(data = UNRATE,x=observation_date,y=unemp_rate,size=I(5), color="orange")+
  geom_line(size = 2, color = "blue")+
  geom_text(aes(x= observation_date,y=unemp_rate, label= unemp_rate,size = 3))+
  labs(title = "Effect of recession on Unemployment rate \nUnemployment rate approcahed 10 by 2010",
       subtitle = "(2006-2011)",
       caption = "Data from the FRED",
       x = "Observation year",
       y = "Unemployment rate")+
  theme_bw()

4.2 Effect of recession on “Deliquency Rate”:

A delinquency rate is the percentage of loans within a loan portfolio that have delinquent payments. Delinquent refers to a situation where a borrower is late or overdue on a payment, such as income taxes, a mortgage, an automobile loan, or a credit card account. We can clearly see from below graph that deliquency rate has increased on credit card loans, commercial and business loans and single family residential mortage loans. I predict, Unemployment and economic crash are the reasons which made people unable to pay their loan amount to the borrower by time.

library(plotly)
library(readxl)
deliquecy_rate_on_mortages <- read_excel("~/Data source/deliquecy rate on mortages.xls")
View(deliquecy_rate_on_mortages)
colors <- c('#4AC6B7', '#1972A4', '#965F8A', '#FF7070', '#C61951')
p <- plot_ly( deliquecy_rate_on_mortages, x = ~Observation_year, y = ~Deliquency_rate, type = 'scatter', mode = 'markers', size = ~Deliquency_rate, color = ~Loan_type, colors = colors,
             sizes = c(10, 50),
             marker = list(opacity = 0.5, sizemode = 'diameter', line = list(width = 2, color = '#FFFFFF')),
             hoverinfo = 'text',
             text = ~paste('Loan type :', Loan_type , '<br>Deliquency rate:',Deliquency_rate , 'year :', Observation_year )) %>%
  layout(title = 'EFFECT OF DELIQUENCY RATE BY LOAN TYPE
         ( Rate on Residential loan kept increasing till 2010 while
         Credit card and Commercial loans kept increasing till 2009)',
         xaxis = list(showgrid = FALSE),
         yaxis = list(showgrid = FALSE),
         showlegend = FALSE)
ggplotly(p)

line.width does not currently support multiple values.line.width does not currently support multiple values.line.width does not currently support multiple values.line.width does not currently support multiple values.line.width does not currently support multiple values.line.width does not currently support multiple values.

4.3 Effect of recession on " Output in manufaturing, electric and gas industry" :

The real output in the manufacturing, mining, electric and gas industries, relative to a base year is measured monthly as the industrial production index (IPI).It also measures capacity, an estimate of the production levels that could be sustainably maintained; and capacity utilization, the ratio of actual output to capacity. Within the overall IPI there are a number of sub-indices providing a detailed look at the output of highly specific industries: residential gas sales, ice cream and frozen desert, carpet and rug mills, spring and wire product, pig iron, audio and video equipment, and paper are just a few of the dozens of industries for which monthly production data is available. Industry-level data are useful for managers and investors within specific lines of business, while the composite index is an important macroeconomic indicator for economists and investors. Fluctuations within the industrial sector account for most of the variation in overall economic growth, so a monthly metric helps keep investors apprised of shifts in output.

library(readxl)
industrial_production_index <- read_excel("~/Data source/industrial_production_index.xls")
plot_ly(industrial_production_index) %>%
  add_trace(x = ~observation_date, y = ~prod_index, 'scatter', mode = 'lines', name = 'industrial production index',
            marker = list(color = '#C9EFF9')) %>%
add_annotations(
    x=industrial_production_index$observation_date[which.min(industrial_production_index$prod_index)],
    y=industrial_production_index$prod_index[which.min(industrial_production_index$prod_index)],
    text = "Lowest capacity utilization rate observed = 86%")%>%
  layout(title = 'EFFECT OF RECESSION ON INDUSTRIAL PRODUCTION INDEX
         ( Data from FRED) \nObserved Year : 2005 - 2013',
         xaxis = list(showgrid = FALSE),
         yaxis = list(showgrid = FALSE),
         showlegend = FALSE)

No trace type specified: Based on info supplied, a ‘scatter’ trace seems appropriate. Read more about this trace type -> https://plot.ly/r/reference/#scatter A marker object has been specified, but markers is not in the mode Adding markers to the mode… No trace type specified: Based on info supplied, a ‘scatter’ trace seems appropriate. Read more about this trace type -> https://plot.ly/r/reference/#scatter A marker object has been specified, but markers is not in the mode Adding markers to the mode…

4.4 Effect of recession on " Capacity utilization rate“:

The capacity utilization rate measures the proportion of potential economic output that is actually realized. Displayed as a percentage, the capacity utilization level provides insight into the overall slack that is in an economy or a firm at a given point in time.The Federal Reserve gathers and publishes data on capacity utilization in the U.S. economy. Capacity utilization tends to fluctuate with business cycles, with firms adjusting production volumes in response to changing demand. Demand declines sharply during recessions, as unemployment rises, wages fall, consumer confidence wanes, and business investments dip.The deepest decline occurred so far in 1982 and 2009, when capacity utilization fell to 70.9% and 66.7%, respectively.The 2009 decline is the effect of great recession.

library(readxl)
capacity <- read_excel("~/Data source/TCU.xls")
plot_ly(data = capacity,
        x =~observation_date,
        y=~capacity_unit,
        type ="scatter",
        color = "Red",
        mode="markers")%>%
  add_annotations(
    x=capacity$observation_date[which.min(capacity$capacity_unit)],
    y=capacity$capacity_unit[which.min(capacity$capacity_unit)],
    text = "Lowest capacity utilization rate observed = 66%")%>%
  layout(title = 'EFFECT OF RECESSION ON CAPACITY UTILIZATION RATE
         ( Data from FRED) \nObserved Year : 2005 - 2012',
         xaxis = list(showgrid = FALSE),
         yaxis = list(showgrid = FALSE),
         showlegend = FALSE)

minimal value for n is 3, returning requested palette with 3 different levels minimal value for n is 3, returning requested palette with 3 different levels minimal value for n is 3, returning requested palette with 3 different levels minimal value for n is 3, returning requested palette with 3 different levels

4.5 Effect of recession on “Construction Sector”:

Construction spending represents about 20% of the gross domestic product, making it a very important source of information. Economists look to construction spending for clues about the overall economy. The construction industry is one of the first to go into a recession when the economy declines and likewise, the first to recover as conditions improve. The data covers three important areas: private construction (residential and nonresidential) and public construction. The residential category includes single family homes and apartments. Nonresidential construction includes factories, offices, hotels, motels, churches, hospitals, and private schools. Finally, the public sector covers highways, streets, military reservations, water supply facilities, public school buildings, housing projects, and sewer systems.

In the following chart, We can clearly predict that spending on construction sector started to decline in 2007 and the lowest spending reached in 2011 of 9.45 million.

library(readxl)
construction_spending <- read_excel("~/Data source/construction spending.xls")
view(construction_spending)

x must either be a summarytools object created with freq(), descr(), or a list of summarytools objects created using by()

options(scipen=999)
plot_ly(data = construction_spending,
        x =~Year,
        y=~Spending_in_millions,
        type ="scatter",
        mode="lines",
        color = "green",
        marker = list(color = 'black'))%>%
  add_annotations(
    x=construction_spending$Year[which.min(construction_spending$Spending_in_millions)],
    y=construction_spending$Spending_in_millions[which.min(construction_spending$Spending_in_millions)],
    text = "Lowest construction spending")%>%
  layout(title = 'EFFECT OF RECESSION ON CONSTRUCTION SPENDING IN MILLION EVERY YEAR
         ( Data from census.gov) \nObserved Year : 2006 - 2012',
         xaxis = list(showgrid = TRUE),
         yaxis = list(showgrid = TRUE),
         showlegend = FALSE)

minimal value for n is 3, returning requested palette with 3 different levels minimal value for n is 3, returning requested palette with 3 different levels A marker object has been specified, but markers is not in the mode Adding markers to the mode… minimal value for n is 3, returning requested palette with 3 different levels minimal value for n is 3, returning requested palette with 3 different levels A marker object has been specified, but markers is not in the mode Adding markers to the mode…

5 AFTER THE GREAT RECESSION:

5.1 Dollar value strengthened :

After the recession,Between 2011 and 2016 the dollar strengthened. There were six reasons the dollar became so strong:

1.Investors worried about the Greek debt crisis. It weakened demand for the euro, the world’s second choice for a global currency. 2.The European Union struggled to boost economic growth through quantitative easing. 3.In 2015, economic reform slowed China’s growth. It pushed investors back into the U.S. dollar. 4.The dollar is a haven during any global crisis. Investors bought U.S. Treasurys to avoid risk as the world recovered unevenly from the 2008 financial crisis and recession. 5.Despite reforms, both China and Japan continued to purchase dollars to control the value of their currencies. It helped them boost exports by making them cheaper. 6.The Federal Reserve signaled that it would raise the fed funds rate. It did so in 2015. Forex traders took advantage of the higher rates as Europe’s interest rates declined.

library(readxl)
us_dollar_index_historical_chart <- read_excel("~/Data source/us-dollar-index-historical-chart.xlsx", 
                                               col_types = c("date", "numeric"))
plot_ly(data = us_dollar_index_historical_chart,
        x = ~Date,
        y= ~value,
        type ="scatter",
        mode="lines",
        linecolor = "green",
        marker = list(color = 'black'))%>%
  add_annotations(
    x=us_dollar_index_historical_chart$Date[which.min(us_dollar_index_historical_chart$value)],
    y=us_dollar_index_historical_chart$value[which.min(us_dollar_index_historical_chart$value)],
    text = "Dollar value index at 80.24, JUly 2011")%>%
  
add_annotations(x=us_dollar_index_historical_chart$Date[which.max(us_dollar_index_historical_chart$value)],
    y=us_dollar_index_historical_chart$value[which.max(us_dollar_index_historical_chart$value)],
    text = "Dollar value index at 103, Dec 2016")%>%
  
  layout(title = 'RISE IN DOLLAR VALUE AFTER RECESSION (2011-2016)Data - census.gov',
         xaxis = list(showgrid = TRUE),
         yaxis = list(showgrid = TRUE),
         showlegend = FALSE)

A marker object has been specified, but markers is not in the mode Adding markers to the mode… ‘scatter’ objects don’t have these attributes: ‘linecolor’ Valid attributes include: ‘type’, ‘visible’, ‘showlegend’, ‘legendgroup’, ‘opacity’, ‘name’, ‘uid’, ‘ids’, ‘customdata’, ‘selectedpoints’, ‘hoverinfo’, ‘hoverlabel’, ‘stream’, ‘transforms’, ‘uirevision’, ‘x’, ‘x0’, ‘dx’, ‘y’, ‘y0’, ‘dy’, ‘stackgroup’, ‘orientation’, ‘groupnorm’, ‘stackgaps’, ‘text’, ‘hovertext’, ‘mode’, ‘hoveron’, ‘hovertemplate’, ‘line’, ‘connectgaps’, ‘cliponaxis’, ‘fill’, ‘fillcolor’, ‘marker’, ‘selected’, ‘unselected’, ‘textposition’, ‘textfont’, ‘r’, ‘t’, ‘error_x’, ‘error_y’, ‘xcalendar’, ‘ycalendar’, ‘xaxis’, ‘yaxis’, ‘idssrc’, ‘customdatasrc’, ‘hoverinfosrc’, ‘xsrc’, ‘ysrc’, ‘textsrc’, ‘hovertextsrc’, ‘hovertemplatesrc’, ‘textpositionsrc’, ‘rsrc’, ‘tsrc’, ‘key’, ‘set’, ‘frame’, ‘transforms’, ’_isNestedKey’, ’_isSimpleKey’, ’_isGraticule’, ’_bbox’ A marker object has been specified, but markers is not in the mode Adding markers to the mode… ‘scatter’ objects don’t have these attributes: ‘linecolor’ Valid attributes include: ‘type’, ‘visible’, ‘showlegend’, ‘legendgroup’, ‘opacity’, ‘name’, ‘uid’, ‘ids’, ‘customdata’, ‘selectedpoints’, ‘hoverinfo’, ‘hoverlabel’, ‘stream’, ‘transforms’, ‘uirevision’, ‘x’, ‘x0’, ‘dx’, ‘y’, ‘y0’, ‘dy’, ‘stackgroup’, ‘orientation’, ‘groupnorm’, ‘stackgaps’, ‘text’, ‘hovertext’, ‘mode’, ‘hoveron’, ‘hovertemplate’, ‘line’, ‘connectgaps’, ‘cliponaxis’, ‘fill’, ‘fillcolor’, ‘marker’, ‘selected’, ‘unselected’, ‘textposition’, ‘textfont’, ‘r’, ‘t’, ‘error_x’, ‘error_y’, ‘xcalendar’, ‘ycalendar’, ‘xaxis’, ‘yaxis’, ‘idssrc’, ‘customdatasrc’, ‘hoverinfosrc’, ‘xsrc’, ‘ysrc’, ‘textsrc’, ‘hovertextsrc’, ‘hovertemplatesrc’, ‘textpositionsrc’, ‘rsrc’, ‘tsrc’, ‘key’, ‘set’, ‘frame’, ‘transforms’, ’_isNestedKey’, ’_isSimpleKey’, ’_isGraticule’, ’_bbox’

LS0tDQp0aXRsZTogIlRoZSBHUkVBVCBSRUNFU1NJT04gRGVjZW1iZXIgMjAwNyB0byBKdW5lIDIwMDkiDQphdXRob3I6ICJJbmR1bWF0aGkgVGhpeWFnYXJhamFuIg0Kb3V0cHV0Og0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogIGh0bWxfbm90ZWJvb2s6DQogICAgaGlnaGxpZ2h0OiBkZWZhdWx0DQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0aGVtZTogbHVtZW4NCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQogIHBkZl9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICBodG1sX2RvY3VtZW50Og0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIHRvYzogeWVzDQotLS0NCg0KICANCg0KYGBge3IgR2xvYmFsIFNldHVwLCBpbmNsdWRlPUZBTFNFLCBlY2hvPUZBTFNFfQ0KDQojIFNldHRpbmcgdXAgc29tZSBnbG9iYWwgb3B0aW9ucyBmb3IgdGhlIGtuaXRyLg0KIyBHZW5lcmFsIHByaW5jaXBsZSBpcyB0aGF0IGxvY2FsIG9wdGlvbnMgb3Zlci1yaWRlIHRoZSBnbG9iYWwuDQojIE1vcmUga25pdHIgb3B0aW9ucyBhcmUgYXZhaWxhYmxlIGhlcmU6IGh0dHBzOi8veWlodWkubmFtZS9rbml0ci9vcHRpb25zLw0KDQprbml0cjo6b3B0c19jaHVuayRzZXQoDQoJI0NodW5rIENvZGUgT3B0aW9ucw0KCWVjaG8gPSBGQUxTRSwNCglpbmNsdWRlID0gVFJVRSwNCglyZXN1bHRzID0gJ2FzaXMnLCANCgljb21tZW50ID0gTkEsIA0KCXByb21wdCA9IEZBTFNFLA0KCQ0KCSNEaXNwbGF5IE9wdGlvbnMNCgljYWNoZSA9IEZBTFNFLA0KDQoJIyBQbG90IE9wdGlvbnMNCglmaWcud2lkdGggPSA3LA0KCWZpZy5oZWlnaHQgPSA1LA0KCQ0KCWZpZy5yZXRpbmEgPSAyLA0KCWZpZy5hbGlnbiA9ICdjZW50ZXInDQoJKQ0KDQpvcHRpb25zKGRpZ2l0cyA9IDQpDQoNCmBgYA0KDQpgYGB7ciBMaWJyYXJpZXMsIGluY2x1ZGUgPUZBTFNFfQ0KDQpsaWJyYXJ5KGtuaXRyKQ0KDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KERUKQ0KDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocHN5Y2gpDQpsaWJyYXJ5KEhtaXNjKQ0KbGlicmFyeShnZ3RoZW1lcykNCmxpYnJhcnkocGxvdGx5KQ0KDQpsaWJyYXJ5KHN1bW1hcnl0b29scykNCg0KDQpgYGANCg0KDQpgYGB7ciBTdW1tYXJ5VG9vbHMgU2V0dXAsIGluY2x1ZGUgPUZBTFNFfQ0KDQpvcHRzX2NodW5rJHNldCgNCgljb21tZW50PU5BLCANCglwcm9tcHQ9RkFMU0UsIA0KCWNhY2hlPUZBTFNFLCANCgllY2hvPVRSVUUsIA0KCXJlc3VsdHM9J2FzaXMnDQopDQoNCnN0X29wdGlvbnMoDQoJcGxhaW4uYXNjaWkgPSBGQUxTRSwgICAgICAgDQogICAgc3R5bGUgPSAicm1hcmtkb3duIiwgICAgICAgDQojCXJlc3VsdHMgPSAnYXNpcycsDQogICAgZm9vdG5vdGUgPSBOQSwgICAgICAgICAgICAgDQoJc3VidGl0bGUuZW1waGFzaXMgPSBUUlVFDQopDQpzdF9jc3MoKQ0KDQoNCmBgYA0KDQoNCiNJTlRST0RVQ1RJT046DQoNCkFmdGVyIGVpZ2h0ZWVuIG1vbnRocyBvZiByZWNlc3Npb24sIHRoZSBsb25nZXN0IHNpbmNlIHRoZSBHcmVhdCBEZXByZXNzaW9uIG9mIHRoZSAxOTMwJ3MsIGdyb3d0aCByZXR1cm5lZCB0byB0aGUgVS5TIGVjb25vbXkgaW4gdGhlIHN1bW1lciBvZiAyMDA5LiBUaGUgcmVjZXNzaW9uIG1heSBub3cgYmUgb2ZmaWNpYWxseSBvdmVyLCBidXQgaXRzIGVmZmVjdHMgbGl2ZSBvbiB0aGUgZm9ybSBvZiB1bmVtcGxveW1lbnQsIGEgaG9zdCBvb2YgYXNzb2NpYXRlZCBsYWJvciBwcm9ibGVtcywgYW5kIHRoZSBvbi1nb2luZyB0aHJlYXQgb2YgZG91YmxlIGRpcCByZWNlc3Npb24gZXZlbiBpbiAyMDE5LiBUaGUgZ3JlYXQgcmVjZXNzaW9uIGhhcyB0cmFuc2Zvcm1lZCB0aGUgc29jaWFsIGFuIGVjb25vbWljIGxpZmUgb2YgdGhlIGNvdW50cnkuIFRvZGF5LCBtb3N0IGVjb25vbWlzdHMgYmVsaWV2ZSB0aGUgR3JlYXQgUmVjZXNzaW9uIG9mIDIwMDctMjAwOSBzdXBlcnNlZGVkIHRoZSAxOTczLTE5NzUgcmVjZXNzaW9uIGluIGludGVuc2l0eS4gQWZ0ZXIgMjAxMSwgdGhlIGVjb25vbXkgc3RhcnRlZCB0byBncm93IHdoZXJlIGNvbXBhbmllcyBoaXJlZCBhZ2FpbiwgY29uc3VtZXJzIHN0YXJ0ZWQgc3BlbmRpbmcsIGFuZCBidXNpbmVzc2VzIHN0YXJ0ZWQgdG8gaW52ZXN0LiBUaGF0IGRvZXNuJ3QgbWVhbiBldmVyeW9uZSBoYXMgZ290dGVuIHRoZWlyIGpvYnMgYmFjayBvciBidXNpbmVzc2VzIGFyZSBpbnZlc3RpbmcgbW9yZSB0aGFuIGJlZm9yZSB0aGUgcmVjZXNzaW9uLiBJdCBqdXN0IG1lYW5zIGEgY291bnRyeSdzIG92ZXJhbGwgZWNvbm9teSBpcyBleHBhbmRpbmcgb3IgZ3Jvd2luZyBvbiBhIHNvbWV3aGF0IG1vcmUgY29uc2lzdGVudCBiYXNpcy4NCg0KUmVmZXJlbmNlOiAxLlRoZSBncmVhdCByZWNlc3Npb24gYnkgRGF2aWQgQi4gR3J1c2t5LCBCcnVjZSBXZXN0ZXJuDQogICAgICAgICAgIDIuaHR0cHM6Ly93d3cuY25iYy5jb20vaWQvNDM1NjMwODENCg0KDQojIENBVVNFIE9GIFJFQ0VTU0lPTjoNCiMjU3VicHJpbWUgbW9ydGdhZ2UgY3Jpc2lzKDIwMDYpIDoNCg0KVGhlIGZpcnN0IHNpZ25zIG9mIHRoZSBHcmVhdCBSZWNlc3Npb24gc3RhcnRlZCBpbiAyMDA2IHdoZW4gaG91c2luZyBwcmljZXMgYmVnYW4gZmFsbGluZy4gSW4gMjAwNiwgdGhlIHN1YnByaW1lIG1vcnRnYWdlIGNyaXNpcyBlcnVwdGVkLiBPbiBOb3ZlbWJlciAxNywgMjAwNiwgdGhlIENvbW1lcmNlIERlcGFydG1lbnQgd2FybmVkIHRoYXQgT2N0b2JlcidzIG5ldyBob21lIHBlcm1pdHMgd2VyZSAyOCBwZXJjZW50IGxvd2VyIHRoYW4gdGhlIHllYXIgYmVmb3JlLiBBdCB0aGlzIHBvaW50LCB0aGUgbW9ydGdhZ2UgY3Jpc2lzIGNvdWxkIGhhdmUgYmVlbiBwcmV2ZW50ZWQuIEJ1dCB0aGUgQnVzaCBhZG1pbmlzdHJhdGlvbiBhbmQgdGhlIEZlZGVyYWwgUmVzZXJ2ZSBkaWQgbm90IHJlYWxpemUgaG93IGdyYXZlIHRob3NlIGVhcmx5IHdhcm5pbmcgc2lnbnMgd2VyZS4gVGhleSBpZ25vcmVkIGRlY2xpbmVzIGluIHRoZSBpbnZlcnRlZCB5aWVsZCBjdXJ2ZS4gSW5zdGVhZCwgdGhleSB0aG91Z2h0IHRoZSBzdHJvbmcgbW9uZXkgc3VwcGx5IGFuZCBsb3ctaW50ZXJlc3QgcmF0ZXMgd291bGQgcmVzdHJpY3QgYW55IHByb2JsZW1zIHRvIHRoZSByZWFsIGVzdGF0ZSBpbmR1c3RyeS4gVGhlc2UgaW50ZXJlc3Qtb25seSBsb2FucyB3ZXJlIG9mZmVyZWQgdG8gc3VicHJpbWUgYm9ycm93ZXJzLiBUaGVzZSBoaWdoLXJpc2sgcGVvcGxlIGFyZSBtb3N0IGxpa2VseSB0byBkZWZhdWx0IG9uIGEgbG9hbi4gVGhlIGJhbmtzIG9mZmVyZWQgdGhlbSBsb3cgaW50ZXJlc3QgcmF0ZXMuICBCdXQgdGhpcyAidG9vLWdvb2QtdG8tYmUtdHJ1ZSIgbG9hbiB0eXBlIHJlc2V0cyB0byBhIG11Y2ggaGlnaGVyIHJhdGUgYWZ0ZXIgYSBjZXJ0YWluIHBlcmlvZC4gSG9tZSBwcmljZXMgZmVsbCBhdCB0aGUgc2FtZSB0aW1lIGludGVyZXN0IHJhdGVzIHJlc2V0LiBUaGVpciBkZWZhdWx0cyBjYXVzZWQgdGhlIHN1YnByaW1lIG1vcnRnYWdlIGNyaXNpcy4NCg0KYGBge3J9DQpsaWJyYXJ5KHJlYWR4bCkNCkhvbWVfcHJpY2UgPC0gcmVhZF9leGNlbCgifi9EYXRhIHNvdXJjZS9zcSBmZWV0IHByaWNlIG9mIG9uZSBmYW1pbHkgaG9tZXMueGxzeCIpDQpWaWV3KEhvbWVfcHJpY2UpDQpxcGxvdChkYXRhID0gSG9tZV9wcmljZSx4PVllYXIseT1tZWRpYW5fcHJpY2VfcGVyX3NxdWFyZWZlZXQpKw0KICBnZW9tX2xpbmUoc2l6ZSA9IDEsIGNvbG9yID0gImJsYWNrIikrDQogIGdlb21fdGV4dChhZXMoeD0gWWVhciAseT0gbWVkaWFuX3ByaWNlX3Blcl9zcXVhcmVmZWV0LCBsYWJlbD0gWWVhciApKSsNCiAgbGFicyh0aXRsZSA9ICJTVUJQUklNRSBNT1JUQUdFIENSSVNJUyBcbiBIb21lIHByaWNlcyBzdGFydGVkIHRvIGRlY2xpbmUgaW4gMjAwNiIsDQogICAgICAgc3VidGl0bGUgPSAiKDIwMDQtMjAxMCkiLA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBmcm9tIHRoZSBGUkVEIiwNCiAgICAgICB0YWcgPSAiZmlndXJlIDEiLA0KICAgICAgIHggPSAiWWVhciIsDQogICAgICAgeSA9ICIgIFxubWVkaWFuX3ByaWNlX3Blcl9zcXVhcmVmZWV0IikrDQogIHRoZW1lX2Vjb25vbWlzdCgpDQoNCmBgYA0KDQoNCkJhbmtzIGhhZCBzb2xkIHRvbyBtYW55IG1vcnRnYWdlLWJhY2tlZCBzZWN1cml0aWVzIHRoYW4gd2hhdCBjb3VsZCBiZSBzdXBwb3J0ZWQgYnkgZ29vZCBtb3J0Z2FnZXMuIFRoYXQgc3VtbWVyLCBTdGFuZGFyZCBhbmQgUG9vcidzIGFuZCBNb29keSdzIGNyZWRpdCByYXRpbmdzIHNlcnZpY2VzIGJvdGggYW5ub3VuY2VkIHRoZWlyIGludGVudGlvbiB0byByZWR1Y2UgdGhlIHJhdGluZ3Mgb24gbW9yZSB0aGFuIDEwMCBib25kcyBiYWNrZWQgYnkgc2Vjb25kLWxpZW4gc3VicHJpbWUgbW9ydGdhZ2VzLiBTdGFuZGFyZCBhbmQgUG9vcidzIGFsc28gcGxhY2VkIG1vcmUgdGhhbiA2MDAgc2VjdXJpdGllcyBiYWNrZWQgYnkgc3VicHJpbWUgcmVzaWRlbnRpYWwgbW9ydGdhZ2VzIG9uICJjcmVkaXQgd2F0Y2giLiBCeSB0aGVuLCBhcyB0aGUgc3VicHJpbWUgY3Jpc2lzIGNvbnRpbnVlZCwgaG91c2luZyBwcmljZXMgYWNyb3NzIHRoZSBjb3VudHJ5IGJlZ2FuIHRvIGZhbGwsIGR1ZSB0byBhIGdsdXQgb2YgbmV3IGhvbWVzIG9uIHRoZSBtYXJrZXQsIHNvIG1pbGxpb25zIG9mIGhvbWVvd25lcnMgYW5kIHRoZWlyIG1vcnRnYWdlIGxlbmRlcnMgd2VyZSBzdWRkZW5seSAidW5kZXJ3YXRlciwiIG1lYW5pbmcgdGhlaXIgaG9tZXMgd2VyZSB2YWx1ZWQgbGVzcyB0aGFuIHRoZWlyIHRvdGFsIGxvYW4gYW1vdW50cy4gSW4gQXVndXN0IDIwMDcsIHRoZSBGZWRlcmFsIFJlc2VydmUgcmVzcG9uZGVkIHRvIHRoZSBzdWJwcmltZSBtb3J0Z2FnZSBjcmlzaXMgYnkgYWRkaW5nICQyNCBiaWxsaW9uIGluIGxpcXVpZGl0eSB0byB0aGUgYmFua2luZyBzeXN0ZW0uQnkgdGhlIGVuZCBvZiAyMDA2LCBNYW55IHBlb3BsZSBzdGFydGVkIHNlbGxpbmcgdGhlaXIgaG9tZSBhbmQgdGhlIGhvbWVvd25lcnMgcmF0ZSBkZWNsaW5lZA0KYGBge3J9DQpob21lb3duZXJzaGlwX3JhdGVfMl8gPC0gcmVhZF9leGNlbCgifi9EYXRhIHNvdXJjZS9ob21lb3duZXJzaGlwIHJhdGUgKDIpLnhscyIpDQpWaWV3KGhvbWVvd25lcnNoaXBfcmF0ZV8yXykNCmdncGxvdChob21lb3duZXJzaGlwX3JhdGVfMl8pK2Flcyh4PW9ic2VydmF0aW9uX3llYXIsIHk9aG9tZW93bmVyc2hpcF9yYXRlKSArIA0KICBnZW9tX3RleHQoYWVzKHg9IG9ic2VydmF0aW9uX3llYXIseT1ob21lb3duZXJzaGlwX3JhdGUgLCBsYWJlbD0gIG9ic2VydmF0aW9uX3llYXIsIHNpemUgPSAzKSkrDQogIGxhYnModGl0bGUgPSAiU1VCUFJJTUUgTU9SVEFHRSBDUklTSVMgXG5Ib21lIG93bmVycyByYXRlIHN0YXJ0ZWQgdG8gZGVjbGluZSBpbiAyMDA2IiwNCiAgICAgICBzdWJ0aXRsZSA9ICIoMjAwNC0yMDE4KSIsDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIGZyb20gdGhlIEZSRUQiLA0KICAgICAgIHRhZyA9ICJmaWd1cmUgMiIsDQogICAgICAgeCA9ICJvYnNlcnZhdGlvbl95ZWFyIiwNCiAgICAgICB5ID0gIiAgXG5Ib21lb3duZXJzaGlwX1JhdGUiKSsNCiAgZ2VvbV9saW5lKGxpbmV0eXBlPSdkYXNoZWQnLCBjb2xvcj0nRGFya2dyZWVuJywgc2l6ZT0xLjIpKw0KICBnZW9tX3BvaW50KGNvbG9yPSdkZWVwcGluazMnLCBhbHBoYT0gMSkrDQogIHRoZW1lX2Vjb25vbWlzdF93aGl0ZSgpDQpgYGANCg0KI0RVUklORyBSRUNFU1NJT04gKERlYyAyMDA3IC0gSnVuZSAyMDA5ICk6DQoNCiMjRmVkIGxvd2VyZWQgaW50ZXJlc3QgcmF0ZXMgOg0KT24gQXByaWwgMTcsIDIwMDcsIHRoZSBGZWRlcmFsIFJlc2VydmUgYW5ub3VuY2VkIHRoYXQgdGhlIGZlZGVyYWwgZmluYW5jaWFsIHJlZ3VsYXRvcnkgYWdlbmNpZXMgdGhhdCBvdmVyc2VlIGxlbmRlcnMgd291bGQgZW5jb3VyYWdlIHRoZW0gdG8gd29yayB3aXRoIGxlbmRlcnMgdG8gd29yayBvdXQgbG9hbiBhcnJhbmdlbWVudHMgcmF0aGVyIHRoYW4gZm9yZWNsb3NlLiBBbHRlcm5hdGl2ZXMgdG8gZm9yZWNsb3N1cmUgaW5jbHVkZSBjb252ZXJ0aW5nIHRoZSBsb2FuIHRvIGEgZml4ZWQtcmF0ZSBtb3J0Z2FnZSwgYW5kIHJlY2VpdmluZyBjcmVkaXQgY291bnNlbGluZyB0aHJvdWdoIHRoZSBDZW50ZXIgZm9yIEZvcmVjbG9zdXJlIFNvbHV0aW9ucy4gQmFua3MgdGhhdCB3b3JrZWQgd2l0aCBib3Jyb3dlcnMgaW4gbG93LWluY29tZSBhcmVhcyBjb3VsZCBhbHNvIHJlY2VpdmUgQ29tbXVuaXR5IFJlaW52ZXN0bWVudCBBY3QgYmVuZWZpdHMuDQoNCkluIFNlcHRlbWJlciwgdGhlIEZlZCBiZWdhbiBsb3dlcmluZyBpbnRlcmVzdCByYXRlcy4gSW50ZXJlc3QgcmF0ZXMgd2VyZSBhdCA1LjI1IHBlcmNlbnQgaW4gU2VwdGVtYmVyIDIwMDcuICBCdXQgdGhlIEZlZCBkaWRuJ3QgZHJvcCByYXRlcyBmYXIgZW5vdWdoLCBvciBmYXN0IGVub3VnaCwgdG8gY2FsbSBtYXJrZXRzLiBCeSB0aGUgZW5kIG9mIDIwMDgsIHRoZSBGZWQgaGFkIHJlZHVjZWQgdGhlIHRhcmdldCBpbnRlcmVzdCByYXRlIHRvIHplcm8gcGVyY2VudCBmb3IgdGhlIGZpcnN0IHRpbWUgaW4gaGlzdG9yeSBpbiBob3BlcyBvZiBvbmNlIGFnYWluIGVuY291cmFnaW5nIGJvcnJvd2luZyBhbmQsIGJ5IGV4dGVuc2lvbiwgY2FwaXRhbCBpbnZlc3RtZW50Lg0KDQojI1N0b2NrIE1hcmtldCBjcmFzaCA6DQpPbiBPY3RvYmVyIDkgMjAwNywgdGhlIFUuUy4gc3RvY2sgbWFya2V0IHJlYWNoZWQgaXRzIGFsbC10aW1lIGhpZ2gsIGFzIHRoZSBrZXkgRG93IEpvbmVzIEluZHVzdHJpYWwgQXZlcmFnZSBleGNlZWRlZCAxNCwwMDAgZm9yIHRoZSBmaXJzdCB0aW1lIGluIGhpc3RvcnkuIE9uIFNlcHRlbWJlciAyOSwgMjAwOCwgdGhlIHN0b2NrIG1hcmtldCBjcmFzaGVkLiAgVGhlIERvdyBKb25lcyBJbmR1c3RyaWFsIEF2ZXJhZ2UgZmVsbCA3NzcuNjggcG9pbnRzIGluIGludHJhLWRheSB0cmFkaW5nLiBPdmVyIHRoZSBuZXh0IDE4IG1vbnRocywgdGhlIERvdyBsb3N0IG1vcmUgdGhhbiBoYWxmIGl0cyB2YWx1ZSwgZmFsbGluZyB0byA2LDU0NyBwb2ludHMuIEFsdGhvdWdoIGEgc3RvY2sgbWFya2V0IGNyYXNoIGNhbiBjYXVzZSBhIHJlY2Vzc2lvbiwgaW4gdGhpcyBjYXNlIGl0IGhhZCBhbHJlYWR5IGJlZ3VuLiBCdXQgdGhlIGNyYXNoIG9mIDIwMDggbWFkZSBhIGJhZCBzaXR1YXRpb24gbXVjaCwgbXVjaCB3b3JzZS4NCg0KYGBge3J9DQpkb3dfam9uZXMgPC0gcmVhZF9leGNlbCgifi9EYXRhIHNvdXJjZS9kb3cgam9uZXMueGxzeCIpDQpWaWV3KGRvd19qb25lcykNCnA8LSBnZ3Bsb3QoZG93X2pvbmVzLCBhZXMoWWVhciwgQXZlcmFnZV9jbG9zaW5nX2J5X3llYXIpKSsNCiAgZ2VvbV9saW5lKHNpemU9MSwgY29sb3IgPSAiQnJvd24iKSsNCiAgZ2VvbV90ZXh0KGFlcyh4PSBZZWFyICx5PSBBdmVyYWdlX2Nsb3NpbmdfYnlfeWVhciwgbGFiZWw9IFllYXIgLCBzaXplID0gNSkpKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvdXIgPSBZZWFyKSkrDQogIGxhYnModGl0bGUgPSAiU1RPQ0sgTUFSS0VUIENSQVNIIFxuRWZmZWN0IG9mIHJlY2Vzc2lvbiBvbiBEb3cgSm9uZXMgYXZlcmFnZSBjbG9zaW5nIGJ5IHllYXIiLA0KICAgICAgIHN1YnRpdGxlID0gIigyMDA1LTIwMTkpIiwNCiAgICAgICBjYXB0aW9uID0gIkRhdGEgZnJvbSB0aGUgRlJFRCIsDQogICAgICAgdGFnID0gImZpZ3VyZSA0IiwNCiAgICAgICB4ID0gIlllYXIiLA0KICAgICAgIHkgPSAiQXZlcmFnZSBjbG9zaW5nIGJ5IHllYXIiKSsNCiAgdGhlbWVfY2FsYygpDQpnZ3Bsb3RseShwKQ0KYGBgDQoNCg0KIyNEcm9wIGluIERvbGxhciB2YWx1ZSA6DQoNCg0KDQoNCmBgYHtyfQ0KbGlicmFyeShyZWFkeGwpDQp1c19kb2xsYXJfaW5kZXhfaGlzdG9yaWNhbF9jaGFydCA8LSByZWFkX2V4Y2VsKCJ+L0RhdGEgc291cmNlL3VzLWRvbGxhci1pbmRleC1oaXN0b3JpY2FsLWNoYXJ0Lnhsc3giKQ0KVmlldyh1c19kb2xsYXJfaW5kZXhfaGlzdG9yaWNhbF9jaGFydCkNCnA8LSBnZ3Bsb3QodXNfZG9sbGFyX2luZGV4X2hpc3RvcmljYWxfY2hhcnQsIGFlcyhEYXRlLCB2YWx1ZSkpKw0KICBnZW9tX2xpbmUoc2l6ZT0xLCBjb2xvciA9ICJyZWQiKSsNCiAgbGFicyh0aXRsZSA9ICJEUk9QIElOIERPTExBUiBWQUxVRSIsDQogICAgICAgc3VidGl0bGUgPSAiKDIwMDUtMjAxOSkiLA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBmcm9tIHRoZSBGUkVEIiwNCiAgICAgICB0YWcgPSAiZmlndXJlIDQiLA0KICAgICAgIHggPSAiWWVhciIsDQogICAgICAgeSA9ICJEb2xsYXIgdmFsdWUiKSsNCiAgdGhlbWVfZ3JheSgpDQpnZ3Bsb3RseShwKQ0KDQpgYGANCg0KDQoNCiMjQmFuayBGYWlsdXJlczoNCg0KVGhlIGJhbmtpbmcgY3Jpc2lzIHRoYXQgZW5zdWVkIHNwZWxsZWQgdGhlIGRlbWlzZSBvZiBodW5kcmVkcyBvZiBpbnN0aXR1dGlvbnM6IEZyb20gMjAwOCB0aHJvdWdoIDIwMTUsIG1vcmUgdGhhbiA1MDAgYmFua3MgZmFpbGVkLCBhY2NvcmRpbmcgdG8gRmVkZXJhbCBEZXBvc2l0IEluc3VyYW5jZSBDb3Jwb3JhdGlvbiAoRkRJQykgZGF0YS4gSW4gY29udHJhc3QsIGluIHRoZSA3IHllYXJzIHRoYXQgcHJlY2VkZWQgdGhlIHJlY2Vzc2lvbiwgMjUgYmFua3MgZmFpbGVkLkR1cmluZyBhbmQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIEdyZWF0IFJlY2Vzc2lvbiwgVVMgYmFuayBmYWlsdXJlcyBiYWxsb29uZWQsIHNwaWtpbmcgdG8gcm91Z2hseSAxNTAgaW4gYm90aCAyMDA5IGFuZCAyMDEwLiBTaW5jZSAyMDE1LCBiYW5rIGZhaWx1cmVzPz8/IGhhdmUgZmFsbGVuIHRvIHNpbmdsZS1kaWdpdCBudW1iZXJzLg0KDQpgYGB7cn0NCiNiYW5rIGZhaWx1cmVzIGJ5IHllYXINCmxpYnJhcnkocmVhZHIpDQpiYW5rX2ZhaWx1cmVzIDwtIHJlYWRfY3N2KCJ+L0RhdGEgc291cmNlL2JhbmsgZmFpbHVyZXMuY3N2IikNCmJhbmtfZmFpbHVyZXMgPSBtdXRhdGUoYmFua19mYWlsdXJlcywgTnVtYmVyX29mX2ZhaWx1cmVzPSBNRVJHRVJTICsgUEFJRF9PRkYpDQp2aWV3KGJhbmtfZmFpbHVyZXMpDQpwbG90X2x5KGRhdGEgPSBiYW5rX2ZhaWx1cmVzLCB4ID0gfllFQVIsIHkgPSB+TnVtYmVyX29mX2ZhaWx1cmVzLCB0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ2xpbmVzJyklPiUNCiAgbGF5b3V0KHRpdGxlID0gIkNPTU1FUkNJQUwgQkFOSyBGQUlMVVJFUyBCWSBZRUFSIiwNCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJZRUFSIiksDQogICAgICAgICB5YXhpcyA9IGxpc3QgKHRpdGxlID0gIk5VTUJFUiBPRiBCQU5LIEZBSUxVUkVTIikpDQogIA0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShyZWFkeGwpDQpiYW5rX2ZhaWx1cmVzX2luX3llYXJzIDwtIHJlYWRfZXhjZWwoIn4vRGF0YSBzb3VyY2UvYmFuayBmYWlsdXJlcyBpbiB5ZWFycy54bHN4IikNClZpZXcoYmFua19mYWlsdXJlc19pbl95ZWFycykNCmo8LWdncGxvdChiYW5rX2ZhaWx1cmVzX2luX3llYXJzKSArDQogIGdlb21fY29sKGFlcyh4ID0gZmFjdG9yKFllYXIpLCB5ID0gQmFua19mYWlsdXJlcywgZmlsbD1mYWN0b3IoVG90YWxfYXNzZXRzX2luX01pbGxpb25zKSkpKw0KICBsYWJzKHRpdGxlID0gIkJhbmsgZmFpbHVyZXMgYnkgeWVhciB3aXRoIHRvdGFsIGFzc2VydHMgaW5kaWNhdGVkIG9uIGNvbG9yIikNCmdncGxvdGx5KGopDQpgYGANCg0KI0VGRkVDVCBPRiBSRUNFU1NJT04gT04gRUNPTk9NSUMgRkFDVE9SUzoNCg0KIyNFZmZlY3Qgb2YgcmVjZXNzaW9uIG9uICJFbXBsb3ltZW50IiA6DQoNCkpvYiBsb3NlcnMgYXJlIHdvcmtlcnMgd2hvIHBlcm1hbmVudGx5IGxvc3QgYSAoc3RhYmxlIG9yIHRlbXBvcmFyeSkgam9iIGluIHRoZSBsYXN0IGZldyB5ZWFycyBhbmQgd2hvIGFyZSBjdXJyZW50bHkgdW5lbXBsb3llZCBvciBvdXQgb2YgdGhlIGxhYm91ciBmb3JjZS4gSm9iIGxvc2VycyBhcmUgZXhhbWluZWQgYXMgYSBzdG9jaywgd2hvc2UgZGVtb2dyYXBoaWMgY2hhcmFjdGVyaXN0aWNzIGFyZSBpZGVudGlmaWVkLCB0b2dldGhlciB3aXRoIHRoZSBsYXN0IGpvYiBoZWxkIGFuZCB0aGUgbGVuZ3RoIG9mIHRpbWUgd2l0aG91dCBhIGpvYi4gQXJvdW5kIDk5NTYgcGVvcGxlIGxvc3QgdGhlIGpvYiBhdCB0aGUgZW5kIG9mIHJlY2Vzc2lvbiBieSBzZXB0ZW1iZXIgMjAwOS4NCg0KYGBge3J9DQpsaWJyYXJ5KHJlYWR4bCkNCmpvYl9sb29zZXJzIDwtIHJlYWRfZXhjZWwoIn4vRGF0YSBzb3VyY2Uvam9iIGxvb3NlcnMueGxzIikNClZpZXcoam9iX2xvb3NlcnMpDQpDIDwtZ2dwbG90KGpvYl9sb29zZXJzLCBhZXMob2JzZXJ2YXRpb25fZGF0ZSxqb2JfbG9zZXJzKSkrDQogIGdlb21fcG9pbnQoYWVzKGNvbG91ciA9IG9ic2VydmF0aW9uX2RhdGUpKSsNCiAgZ2VvbV9zbW9vdGgoc2U9IEZBTFNFKSsNCiAgbGFicyh0aXRsZSA9ICJFRkZFQ1QgT0YgUkVDRVNTSU9OIE9OIEVNUExPWU1FTlQiLCB4PSAiT0JTRVJWQVRJT04gWUVBUiIseT0iSk9CIExPU0VSUyBJTiBUSE9VU0FORFMiLCBjb2xvdXI9InllYXIiLA0KICAgICAgIHN1YnRpdGxlID0gIigyMDA1LTIwMTQpIiwNCiAgICAgICBjYXB0aW9uID0gIkRhdGEgZnJvbSB0aGUgRlJFRCIsDQogICAgICAgeCA9ICJPYnNlcnZhdGlvbiB5ZWFyIiwNCiAgICAgICB5ID0gIkpvYiBsb3NlcnMgaW4gdGhvdXNhbmRzIikrDQogIHRoZW1lX2J3KCkNCmdncGxvdGx5KEMpDQoNCg0KYGBgDQoNClRoZSB1bmVtcGxveW1lbnQgcmF0ZSBpcyB0aGUgc2hhcmUgb2YgdGhlIGxhYm9yIGZvcmNlIHRoYXQgaXMgam9ibGVzcywgZXhwcmVzc2VkIGFzIGEgcGVyY2VudGFnZS4gSXQgaXMgYSBsYWdnaW5nIGluZGljYXRvciwgbWVhbmluZyB0aGF0IGl0IGdlbmVyYWxseSByaXNlcyBvciBmYWxscyBpbiB0aGUgd2FrZSBvZiBjaGFuZ2luZyBlY29ub21pYyBjb25kaXRpb25zLCByYXRoZXIgdGhhbiBhbnRpY2lwYXRpbmcgdGhlbS4gV2hlbiB0aGUgZWNvbm9teSBpcyBpbiBwb29yIHNoYXBlIGFuZCBqb2JzIGFyZSBzY2FyY2UsIHRoZSB1bmVtcGxveW1lbnQgcmF0ZSBjYW4gYmUgZXhwZWN0ZWQgdG8gcmlzZS4gV2hlbiB0aGUgZWNvbm9teSBpcyBncm93aW5nIGF0IGEgaGVhbHRoeSByYXRlIGFuZCBqb2JzIGFyZSByZWxhdGl2ZWx5IHBsZW50aWZ1bCwgaXQgY2FuIGJlIGV4cGVjdGVkIHRvIGZhbGwuIEluIHRoZSB5ZWFyIDIwMTAsIFVuZW1wbG95bWVudCByYXRlIHJlYWNoZWQgOS42DQoNCmBgYHtyfQ0KbGlicmFyeShyZWFkeGwpDQpVTlJBVEUgPC0gcmVhZF9leGNlbCgifi9EYXRhIHNvdXJjZS9VTlJBVEUueGxzIikNClZpZXcoVU5SQVRFKQ0KcXBsb3QoZGF0YSA9IFVOUkFURSx4PW9ic2VydmF0aW9uX2RhdGUseT11bmVtcF9yYXRlLHNpemU9SSg1KSwgY29sb3I9Im9yYW5nZSIpKw0KICBnZW9tX2xpbmUoc2l6ZSA9IDIsIGNvbG9yID0gImJsdWUiKSsNCiAgZ2VvbV90ZXh0KGFlcyh4PSBvYnNlcnZhdGlvbl9kYXRlLHk9dW5lbXBfcmF0ZSwgbGFiZWw9IHVuZW1wX3JhdGUsc2l6ZSA9IDMpKSsNCiAgbGFicyh0aXRsZSA9ICJFZmZlY3Qgb2YgcmVjZXNzaW9uIG9uIFVuZW1wbG95bWVudCByYXRlIFxuVW5lbXBsb3ltZW50IHJhdGUgYXBwcm9jYWhlZCAxMCBieSAyMDEwIiwNCiAgICAgICBzdWJ0aXRsZSA9ICIoMjAwNi0yMDExKSIsDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIGZyb20gdGhlIEZSRUQiLA0KICAgICAgIHggPSAiT2JzZXJ2YXRpb24geWVhciIsDQogICAgICAgeSA9ICJVbmVtcGxveW1lbnQgcmF0ZSIpKw0KICB0aGVtZV9idygpDQpgYGANCg0KDQoNCiMjIEVmZmVjdCBvZiByZWNlc3Npb24gb24gIkRlbGlxdWVuY3kgUmF0ZSI6DQoNCkEgZGVsaW5xdWVuY3kgcmF0ZSBpcyB0aGUgcGVyY2VudGFnZSBvZiBsb2FucyB3aXRoaW4gYSBsb2FuIHBvcnRmb2xpbyB0aGF0IGhhdmUgZGVsaW5xdWVudCBwYXltZW50cy4gRGVsaW5xdWVudCByZWZlcnMgdG8gYSBzaXR1YXRpb24gd2hlcmUgYSBib3Jyb3dlciBpcyBsYXRlIG9yIG92ZXJkdWUgb24gYSBwYXltZW50LCBzdWNoIGFzIGluY29tZSB0YXhlcywgYSBtb3J0Z2FnZSwgYW4gYXV0b21vYmlsZSBsb2FuLCBvciBhIGNyZWRpdCBjYXJkIGFjY291bnQuIFdlIGNhbiBjbGVhcmx5IHNlZSBmcm9tIGJlbG93IGdyYXBoIHRoYXQgZGVsaXF1ZW5jeSByYXRlIGhhcyBpbmNyZWFzZWQgb24gY3JlZGl0IGNhcmQgbG9hbnMsIGNvbW1lcmNpYWwgYW5kIGJ1c2luZXNzIGxvYW5zIGFuZCBzaW5nbGUgZmFtaWx5IHJlc2lkZW50aWFsIG1vcnRhZ2UgbG9hbnMuIEkgcHJlZGljdCwgVW5lbXBsb3ltZW50IGFuZCBlY29ub21pYyBjcmFzaCBhcmUgdGhlIHJlYXNvbnMgd2hpY2ggbWFkZSBwZW9wbGUgdW5hYmxlIHRvIHBheSB0aGVpciBsb2FuIGFtb3VudCB0byB0aGUgYm9ycm93ZXIgYnkgdGltZS4gDQoNCmBgYHtyfQ0KbGlicmFyeShwbG90bHkpDQoNCmxpYnJhcnkocmVhZHhsKQ0KZGVsaXF1ZWN5X3JhdGVfb25fbW9ydGFnZXMgPC0gcmVhZF9leGNlbCgifi9EYXRhIHNvdXJjZS9kZWxpcXVlY3kgcmF0ZSBvbiBtb3J0YWdlcy54bHMiKQ0KVmlldyhkZWxpcXVlY3lfcmF0ZV9vbl9tb3J0YWdlcykNCmNvbG9ycyA8LSBjKCcjNEFDNkI3JywgJyMxOTcyQTQnLCAnIzk2NUY4QScsICcjRkY3MDcwJywgJyNDNjE5NTEnKQ0KDQpwIDwtIHBsb3RfbHkoIGRlbGlxdWVjeV9yYXRlX29uX21vcnRhZ2VzLCB4ID0gfk9ic2VydmF0aW9uX3llYXIsIHkgPSB+RGVsaXF1ZW5jeV9yYXRlLCB0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ21hcmtlcnMnLCBzaXplID0gfkRlbGlxdWVuY3lfcmF0ZSwgY29sb3IgPSB+TG9hbl90eXBlLCBjb2xvcnMgPSBjb2xvcnMsDQogICAgICAgICAgICAgc2l6ZXMgPSBjKDEwLCA1MCksDQogICAgICAgICAgICAgbWFya2VyID0gbGlzdChvcGFjaXR5ID0gMC41LCBzaXplbW9kZSA9ICdkaWFtZXRlcicsIGxpbmUgPSBsaXN0KHdpZHRoID0gMiwgY29sb3IgPSAnI0ZGRkZGRicpKSwNCiAgICAgICAgICAgICBob3ZlcmluZm8gPSAndGV4dCcsDQogICAgICAgICAgICAgdGV4dCA9IH5wYXN0ZSgnTG9hbiB0eXBlIDonLCBMb2FuX3R5cGUgLCAnPGJyPkRlbGlxdWVuY3kgcmF0ZTonLERlbGlxdWVuY3lfcmF0ZSAsICd5ZWFyIDonLCBPYnNlcnZhdGlvbl95ZWFyICkpICU+JQ0KICBsYXlvdXQodGl0bGUgPSAnRUZGRUNUIE9GIERFTElRVUVOQ1kgUkFURSBCWSBMT0FOIFRZUEUNCiAgICAgICAgICggUmF0ZSBvbiBSZXNpZGVudGlhbCBsb2FuIGtlcHQgaW5jcmVhc2luZyB0aWxsIDIwMTAgd2hpbGUNCiAgICAgICAgIENyZWRpdCBjYXJkIGFuZCBDb21tZXJjaWFsIGxvYW5zIGtlcHQgaW5jcmVhc2luZyB0aWxsIDIwMDkpJywNCiAgICAgICAgIHhheGlzID0gbGlzdChzaG93Z3JpZCA9IEZBTFNFKSwNCiAgICAgICAgIHlheGlzID0gbGlzdChzaG93Z3JpZCA9IEZBTFNFKSwNCiAgICAgICAgIHNob3dsZWdlbmQgPSBGQUxTRSkNCmdncGxvdGx5KHApDQoNCmBgYA0KDQoNCiMjRWZmZWN0IG9mIHJlY2Vzc2lvbiBvbiAiIE91dHB1dCBpbiBtYW51ZmF0dXJpbmcsIGVsZWN0cmljIGFuZCBnYXMgaW5kdXN0cnkiIDoNCg0KVGhlIHJlYWwgb3V0cHV0IGluIHRoZSBtYW51ZmFjdHVyaW5nLCBtaW5pbmcsIGVsZWN0cmljIGFuZCBnYXMgaW5kdXN0cmllcywgcmVsYXRpdmUgdG8gYSBiYXNlIHllYXIgaXMgbWVhc3VyZWQgbW9udGhseSBhcyB0aGUgaW5kdXN0cmlhbCBwcm9kdWN0aW9uIGluZGV4IChJUEkpLkl0IGFsc28gbWVhc3VyZXMgY2FwYWNpdHksIGFuIGVzdGltYXRlIG9mIHRoZSBwcm9kdWN0aW9uIGxldmVscyB0aGF0IGNvdWxkIGJlIHN1c3RhaW5hYmx5IG1haW50YWluZWQ7IGFuZCBjYXBhY2l0eSB1dGlsaXphdGlvbiwgdGhlIHJhdGlvIG9mIGFjdHVhbCBvdXRwdXQgdG8gY2FwYWNpdHkuDQpXaXRoaW4gdGhlIG92ZXJhbGwgSVBJIHRoZXJlIGFyZSBhIG51bWJlciBvZiBzdWItaW5kaWNlcyBwcm92aWRpbmcgYSBkZXRhaWxlZCBsb29rIGF0IHRoZSBvdXRwdXQgb2YgaGlnaGx5IHNwZWNpZmljIGluZHVzdHJpZXM6IHJlc2lkZW50aWFsIGdhcyBzYWxlcywgaWNlIGNyZWFtIGFuZCBmcm96ZW4gZGVzZXJ0LCBjYXJwZXQgYW5kIHJ1ZyBtaWxscywgc3ByaW5nIGFuZCB3aXJlIHByb2R1Y3QsIHBpZyBpcm9uLCBhdWRpbyBhbmQgdmlkZW8gZXF1aXBtZW50LCBhbmQgcGFwZXIgYXJlIGp1c3QgYSBmZXcgb2YgdGhlIGRvemVucyBvZiBpbmR1c3RyaWVzIGZvciB3aGljaCBtb250aGx5IHByb2R1Y3Rpb24gZGF0YSBpcyBhdmFpbGFibGUuIEluZHVzdHJ5LWxldmVsIGRhdGEgYXJlIHVzZWZ1bCBmb3IgbWFuYWdlcnMgYW5kIGludmVzdG9ycyB3aXRoaW4gc3BlY2lmaWMgbGluZXMgb2YgYnVzaW5lc3MsIHdoaWxlIHRoZSBjb21wb3NpdGUgaW5kZXggaXMgYW4gaW1wb3J0YW50IG1hY3JvZWNvbm9taWMgaW5kaWNhdG9yIGZvciBlY29ub21pc3RzIGFuZCBpbnZlc3RvcnMuIEZsdWN0dWF0aW9ucyB3aXRoaW4gdGhlIGluZHVzdHJpYWwgc2VjdG9yIGFjY291bnQgZm9yIG1vc3Qgb2YgdGhlIHZhcmlhdGlvbiBpbiBvdmVyYWxsIGVjb25vbWljIGdyb3d0aCwgc28gYSBtb250aGx5IG1ldHJpYyBoZWxwcyBrZWVwIGludmVzdG9ycyBhcHByaXNlZCBvZiBzaGlmdHMgaW4gb3V0cHV0LiANCg0KYGBge3J9DQpsaWJyYXJ5KHJlYWR4bCkNCmluZHVzdHJpYWxfcHJvZHVjdGlvbl9pbmRleCA8LSByZWFkX2V4Y2VsKCJ+L0RhdGEgc291cmNlL2luZHVzdHJpYWxfcHJvZHVjdGlvbl9pbmRleC54bHMiKQ0KcGxvdF9seShpbmR1c3RyaWFsX3Byb2R1Y3Rpb25faW5kZXgpICU+JQ0KICBhZGRfdHJhY2UoeCA9IH5vYnNlcnZhdGlvbl9kYXRlLCB5ID0gfnByb2RfaW5kZXgsICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcycsIG5hbWUgPSAnaW5kdXN0cmlhbCBwcm9kdWN0aW9uIGluZGV4JywNCiAgICAgICAgICAgIG1hcmtlciA9IGxpc3QoY29sb3IgPSAnI0M5RUZGOScpKSAlPiUNCmFkZF9hbm5vdGF0aW9ucygNCiAgICB4PWluZHVzdHJpYWxfcHJvZHVjdGlvbl9pbmRleCRvYnNlcnZhdGlvbl9kYXRlW3doaWNoLm1pbihpbmR1c3RyaWFsX3Byb2R1Y3Rpb25faW5kZXgkcHJvZF9pbmRleCldLA0KICAgIHk9aW5kdXN0cmlhbF9wcm9kdWN0aW9uX2luZGV4JHByb2RfaW5kZXhbd2hpY2gubWluKGluZHVzdHJpYWxfcHJvZHVjdGlvbl9pbmRleCRwcm9kX2luZGV4KV0sDQogICAgdGV4dCA9ICJMb3dlc3QgY2FwYWNpdHkgdXRpbGl6YXRpb24gcmF0ZSBvYnNlcnZlZCA9IDg2JSIpJT4lDQogIGxheW91dCh0aXRsZSA9ICdFRkZFQ1QgT0YgUkVDRVNTSU9OIE9OIElORFVTVFJJQUwgUFJPRFVDVElPTiBJTkRFWA0KICAgICAgICAgKCBEYXRhIGZyb20gRlJFRCkgXG5PYnNlcnZlZCBZZWFyIDogMjAwNSAtIDIwMTMnLA0KICAgICAgICAgeGF4aXMgPSBsaXN0KHNob3dncmlkID0gRkFMU0UpLA0KICAgICAgICAgeWF4aXMgPSBsaXN0KHNob3dncmlkID0gRkFMU0UpLA0KICAgICAgICAgc2hvd2xlZ2VuZCA9IEZBTFNFKQ0KDQpgYGANCg0KDQoNCg0KIyNFZmZlY3Qgb2YgcmVjZXNzaW9uIG9uICIgQ2FwYWNpdHkgdXRpbGl6YXRpb24gcmF0ZSI6DQoNClRoZSBjYXBhY2l0eSB1dGlsaXphdGlvbiByYXRlIG1lYXN1cmVzIHRoZSBwcm9wb3J0aW9uIG9mIHBvdGVudGlhbCBlY29ub21pYyBvdXRwdXQgdGhhdCBpcyBhY3R1YWxseSByZWFsaXplZC4gRGlzcGxheWVkIGFzIGEgcGVyY2VudGFnZSwgdGhlIGNhcGFjaXR5IHV0aWxpemF0aW9uIGxldmVsIHByb3ZpZGVzIGluc2lnaHQgaW50byB0aGUgb3ZlcmFsbCBzbGFjayB0aGF0IGlzIGluIGFuIGVjb25vbXkgb3IgYSBmaXJtIGF0IGEgZ2l2ZW4gcG9pbnQgaW4gdGltZS5UaGUgRmVkZXJhbCBSZXNlcnZlIGdhdGhlcnMgYW5kIHB1Ymxpc2hlcyBkYXRhIG9uIGNhcGFjaXR5IHV0aWxpemF0aW9uIGluIHRoZSBVLlMuIGVjb25vbXkuIENhcGFjaXR5IHV0aWxpemF0aW9uIHRlbmRzIHRvIGZsdWN0dWF0ZSB3aXRoIGJ1c2luZXNzIGN5Y2xlcywgd2l0aCBmaXJtcyBhZGp1c3RpbmcgcHJvZHVjdGlvbiB2b2x1bWVzIGluIHJlc3BvbnNlIHRvIGNoYW5naW5nIGRlbWFuZC4gRGVtYW5kIGRlY2xpbmVzIHNoYXJwbHkgZHVyaW5nIHJlY2Vzc2lvbnMsIGFzIHVuZW1wbG95bWVudCByaXNlcywgd2FnZXMgZmFsbCwgY29uc3VtZXIgY29uZmlkZW5jZSB3YW5lcywgYW5kIGJ1c2luZXNzIGludmVzdG1lbnRzIGRpcC5UaGUgZGVlcGVzdCBkZWNsaW5lIG9jY3VycmVkIHNvIGZhciBpbiAxOTgyIGFuZCAyMDA5LCB3aGVuIGNhcGFjaXR5IHV0aWxpemF0aW9uIGZlbGwgdG8gNzAuOSUgYW5kIDY2LjclLCByZXNwZWN0aXZlbHkuVGhlIDIwMDkgZGVjbGluZSBpcyB0aGUgZWZmZWN0IG9mIGdyZWF0IHJlY2Vzc2lvbi4NCmBgYHtyfQ0KbGlicmFyeShyZWFkeGwpDQpjYXBhY2l0eSA8LSByZWFkX2V4Y2VsKCJ+L0RhdGEgc291cmNlL1RDVS54bHMiKQ0KcGxvdF9seShkYXRhID0gY2FwYWNpdHksDQogICAgICAgIHggPX5vYnNlcnZhdGlvbl9kYXRlLA0KICAgICAgICB5PX5jYXBhY2l0eV91bml0LA0KICAgICAgICB0eXBlID0ic2NhdHRlciIsDQogICAgICAgIGNvbG9yID0gIlJlZCIsDQogICAgICAgIG1vZGU9Im1hcmtlcnMiKSU+JQ0KICBhZGRfYW5ub3RhdGlvbnMoDQogICAgeD1jYXBhY2l0eSRvYnNlcnZhdGlvbl9kYXRlW3doaWNoLm1pbihjYXBhY2l0eSRjYXBhY2l0eV91bml0KV0sDQogICAgeT1jYXBhY2l0eSRjYXBhY2l0eV91bml0W3doaWNoLm1pbihjYXBhY2l0eSRjYXBhY2l0eV91bml0KV0sDQogICAgdGV4dCA9ICJMb3dlc3QgY2FwYWNpdHkgdXRpbGl6YXRpb24gcmF0ZSBvYnNlcnZlZCA9IDY2JSIpJT4lDQogIGxheW91dCh0aXRsZSA9ICdFRkZFQ1QgT0YgUkVDRVNTSU9OIE9OIENBUEFDSVRZIFVUSUxJWkFUSU9OIFJBVEUNCiAgICAgICAgICggRGF0YSBmcm9tIEZSRUQpIFxuT2JzZXJ2ZWQgWWVhciA6IDIwMDUgLSAyMDEyJywNCiAgICAgICAgIHhheGlzID0gbGlzdChzaG93Z3JpZCA9IEZBTFNFKSwNCiAgICAgICAgIHlheGlzID0gbGlzdChzaG93Z3JpZCA9IEZBTFNFKSwNCiAgICAgICAgIHNob3dsZWdlbmQgPSBGQUxTRSkNCmBgYA0KDQoNCiMjIEVmZmVjdCBvZiByZWNlc3Npb24gb24gIkNvbnN0cnVjdGlvbiBTZWN0b3IiOg0KDQpDb25zdHJ1Y3Rpb24gc3BlbmRpbmcgcmVwcmVzZW50cyBhYm91dCAyMCUgb2YgdGhlIGdyb3NzIGRvbWVzdGljIHByb2R1Y3QsIG1ha2luZyBpdCBhIHZlcnkgaW1wb3J0YW50IHNvdXJjZSBvZiBpbmZvcm1hdGlvbi4gRWNvbm9taXN0cyBsb29rIHRvIGNvbnN0cnVjdGlvbiBzcGVuZGluZyBmb3IgY2x1ZXMgYWJvdXQgdGhlIG92ZXJhbGwgZWNvbm9teS4gVGhlIGNvbnN0cnVjdGlvbiBpbmR1c3RyeSBpcyBvbmUgb2YgdGhlIGZpcnN0IHRvIGdvIGludG8gYSByZWNlc3Npb24gd2hlbiB0aGUgZWNvbm9teSBkZWNsaW5lcyBhbmQgbGlrZXdpc2UsIHRoZSBmaXJzdCB0byByZWNvdmVyIGFzIGNvbmRpdGlvbnMgaW1wcm92ZS4gVGhlIGRhdGEgY292ZXJzIHRocmVlIGltcG9ydGFudCBhcmVhczogcHJpdmF0ZSBjb25zdHJ1Y3Rpb24gKHJlc2lkZW50aWFsIGFuZCBub25yZXNpZGVudGlhbCkgYW5kIHB1YmxpYyBjb25zdHJ1Y3Rpb24uIFRoZSByZXNpZGVudGlhbCBjYXRlZ29yeSBpbmNsdWRlcyBzaW5nbGUgZmFtaWx5IGhvbWVzIGFuZCBhcGFydG1lbnRzLiBOb25yZXNpZGVudGlhbCBjb25zdHJ1Y3Rpb24gaW5jbHVkZXMgZmFjdG9yaWVzLCBvZmZpY2VzLCBob3RlbHMsIG1vdGVscywgY2h1cmNoZXMsIGhvc3BpdGFscywgYW5kIHByaXZhdGUgc2Nob29scy4gRmluYWxseSwgdGhlIHB1YmxpYyBzZWN0b3IgY292ZXJzIGhpZ2h3YXlzLCBzdHJlZXRzLCBtaWxpdGFyeSByZXNlcnZhdGlvbnMsIHdhdGVyIHN1cHBseSBmYWNpbGl0aWVzLCBwdWJsaWMgc2Nob29sIGJ1aWxkaW5ncywgaG91c2luZyBwcm9qZWN0cywgYW5kIHNld2VyIHN5c3RlbXMuDQoNCkluIHRoZSBmb2xsb3dpbmcgY2hhcnQsIFdlIGNhbiBjbGVhcmx5IHByZWRpY3QgdGhhdCBzcGVuZGluZyBvbiBjb25zdHJ1Y3Rpb24gc2VjdG9yIHN0YXJ0ZWQgdG8gZGVjbGluZSBpbiAyMDA3IGFuZCB0aGUgbG93ZXN0IHNwZW5kaW5nIHJlYWNoZWQgaW4gMjAxMSBvZiA5LjQ1IG1pbGxpb24uDQoNCmBgYHtyfQ0KbGlicmFyeShyZWFkeGwpDQpjb25zdHJ1Y3Rpb25fc3BlbmRpbmcgPC0gcmVhZF9leGNlbCgifi9EYXRhIHNvdXJjZS9jb25zdHJ1Y3Rpb24gc3BlbmRpbmcueGxzIikNCnZpZXcoY29uc3RydWN0aW9uX3NwZW5kaW5nKQ0Kb3B0aW9ucyhzY2lwZW49OTk5KQ0KcGxvdF9seShkYXRhID0gY29uc3RydWN0aW9uX3NwZW5kaW5nLA0KICAgICAgICB4ID1+WWVhciwNCiAgICAgICAgeT1+U3BlbmRpbmdfaW5fbWlsbGlvbnMsDQogICAgICAgIHR5cGUgPSJzY2F0dGVyIiwNCiAgICAgICAgbW9kZT0ibGluZXMiLA0KICAgICAgICBjb2xvciA9ICJncmVlbiIsDQogICAgICAgIG1hcmtlciA9IGxpc3QoY29sb3IgPSAnYmxhY2snKSklPiUNCiAgYWRkX2Fubm90YXRpb25zKA0KICAgIHg9Y29uc3RydWN0aW9uX3NwZW5kaW5nJFllYXJbd2hpY2gubWluKGNvbnN0cnVjdGlvbl9zcGVuZGluZyRTcGVuZGluZ19pbl9taWxsaW9ucyldLA0KICAgIHk9Y29uc3RydWN0aW9uX3NwZW5kaW5nJFNwZW5kaW5nX2luX21pbGxpb25zW3doaWNoLm1pbihjb25zdHJ1Y3Rpb25fc3BlbmRpbmckU3BlbmRpbmdfaW5fbWlsbGlvbnMpXSwNCiAgICB0ZXh0ID0gIkxvd2VzdCBjb25zdHJ1Y3Rpb24gc3BlbmRpbmciKSU+JQ0KICBsYXlvdXQodGl0bGUgPSAnRUZGRUNUIE9GIFJFQ0VTU0lPTiBPTiBDT05TVFJVQ1RJT04gU1BFTkRJTkcgSU4gTUlMTElPTiBFVkVSWSBZRUFSDQogICAgICAgICAoIERhdGEgZnJvbSBjZW5zdXMuZ292KSBcbk9ic2VydmVkIFllYXIgOiAyMDA2IC0gMjAxMicsDQogICAgICAgICB4YXhpcyA9IGxpc3Qoc2hvd2dyaWQgPSBUUlVFKSwNCiAgICAgICAgIHlheGlzID0gbGlzdChzaG93Z3JpZCA9IFRSVUUpLA0KICAgICAgICAgc2hvd2xlZ2VuZCA9IEZBTFNFKQ0KDQoNCg0KYGBgDQoNCg0KDQojQUZURVIgVEhFIEdSRUFUIFJFQ0VTU0lPTjoNCg0KIyNEb2xsYXIgdmFsdWUgc3RyZW5ndGhlbmVkIDoNCg0KQWZ0ZXIgdGhlIHJlY2Vzc2lvbixCZXR3ZWVuIDIwMTEgYW5kIDIwMTYgdGhlIGRvbGxhciBzdHJlbmd0aGVuZWQuIFRoZXJlIHdlcmUgc2l4IHJlYXNvbnMgdGhlIGRvbGxhciBiZWNhbWUgc28gc3Ryb25nOg0KDQoxLkludmVzdG9ycyB3b3JyaWVkIGFib3V0IHRoZSBHcmVlayBkZWJ0IGNyaXNpcy4gSXQgd2Vha2VuZWQgZGVtYW5kIGZvciB0aGUgZXVybywgdGhlIHdvcmxkJ3Mgc2Vjb25kIGNob2ljZSBmb3IgYSBnbG9iYWwgY3VycmVuY3kuIA0KMi5UaGUgRXVyb3BlYW4gVW5pb24gc3RydWdnbGVkIHRvIGJvb3N0IGVjb25vbWljIGdyb3d0aCB0aHJvdWdoIHF1YW50aXRhdGl2ZSBlYXNpbmcuIA0KMy5JbiAyMDE1LCBlY29ub21pYyByZWZvcm0gc2xvd2VkIENoaW5hJ3MgZ3Jvd3RoLiBJdCBwdXNoZWQgaW52ZXN0b3JzIGJhY2sgaW50byB0aGUgVS5TLiBkb2xsYXIuDQo0LlRoZSBkb2xsYXIgaXMgYSBoYXZlbiBkdXJpbmcgYW55IGdsb2JhbCBjcmlzaXMuIEludmVzdG9ycyBib3VnaHQgVS5TLiBUcmVhc3VyeXMgdG8gYXZvaWQgcmlzayBhcyB0aGUgd29ybGQgcmVjb3ZlcmVkIHVuZXZlbmx5IGZyb20gdGhlIDIwMDggZmluYW5jaWFsIGNyaXNpcyBhbmQgcmVjZXNzaW9uLg0KNS5EZXNwaXRlIHJlZm9ybXMsIGJvdGggQ2hpbmEgYW5kIEphcGFuIGNvbnRpbnVlZCB0byBwdXJjaGFzZSBkb2xsYXJzIHRvIGNvbnRyb2wgdGhlIHZhbHVlIG9mIHRoZWlyIGN1cnJlbmNpZXMuIEl0IGhlbHBlZCB0aGVtIGJvb3N0IGV4cG9ydHMgYnkgbWFraW5nIHRoZW0gY2hlYXBlci4gDQo2LlRoZSBGZWRlcmFsIFJlc2VydmUgc2lnbmFsZWQgdGhhdCBpdCB3b3VsZCByYWlzZSB0aGUgZmVkIGZ1bmRzIHJhdGUuIEl0IGRpZCBzbyBpbiAyMDE1LiBGb3JleCB0cmFkZXJzIHRvb2sgYWR2YW50YWdlIG9mIHRoZSBoaWdoZXIgcmF0ZXMgYXMgRXVyb3BlJ3MgaW50ZXJlc3QgcmF0ZXMgZGVjbGluZWQuDQpgYGB7cn0NCmxpYnJhcnkocmVhZHhsKQ0KdXNfZG9sbGFyX2luZGV4X2hpc3RvcmljYWxfY2hhcnQgPC0gcmVhZF9leGNlbCgifi9EYXRhIHNvdXJjZS91cy1kb2xsYXItaW5kZXgtaGlzdG9yaWNhbC1jaGFydC54bHN4IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlcyA9IGMoImRhdGUiLCAibnVtZXJpYyIpKQ0KDQpwbG90X2x5KGRhdGEgPSB1c19kb2xsYXJfaW5kZXhfaGlzdG9yaWNhbF9jaGFydCwNCiAgICAgICAgeCA9IH5EYXRlLA0KICAgICAgICB5PSB+dmFsdWUsDQogICAgICAgIHR5cGUgPSJzY2F0dGVyIiwNCiAgICAgICAgbW9kZT0ibGluZXMiLA0KICAgICAgICBsaW5lY29sb3IgPSAiZ3JlZW4iLA0KICAgICAgICBtYXJrZXIgPSBsaXN0KGNvbG9yID0gJ2JsYWNrJykpJT4lDQogIGFkZF9hbm5vdGF0aW9ucygNCiAgICB4PXVzX2RvbGxhcl9pbmRleF9oaXN0b3JpY2FsX2NoYXJ0JERhdGVbd2hpY2gubWluKHVzX2RvbGxhcl9pbmRleF9oaXN0b3JpY2FsX2NoYXJ0JHZhbHVlKV0sDQogICAgeT11c19kb2xsYXJfaW5kZXhfaGlzdG9yaWNhbF9jaGFydCR2YWx1ZVt3aGljaC5taW4odXNfZG9sbGFyX2luZGV4X2hpc3RvcmljYWxfY2hhcnQkdmFsdWUpXSwNCiAgICB0ZXh0ID0gIkRvbGxhciB2YWx1ZSBpbmRleCBhdCA4MC4yNCwgSlVseSAyMDExIiklPiUNCiAgDQphZGRfYW5ub3RhdGlvbnMoeD11c19kb2xsYXJfaW5kZXhfaGlzdG9yaWNhbF9jaGFydCREYXRlW3doaWNoLm1heCh1c19kb2xsYXJfaW5kZXhfaGlzdG9yaWNhbF9jaGFydCR2YWx1ZSldLA0KICAgIHk9dXNfZG9sbGFyX2luZGV4X2hpc3RvcmljYWxfY2hhcnQkdmFsdWVbd2hpY2gubWF4KHVzX2RvbGxhcl9pbmRleF9oaXN0b3JpY2FsX2NoYXJ0JHZhbHVlKV0sDQogICAgdGV4dCA9ICJEb2xsYXIgdmFsdWUgaW5kZXggYXQgMTAzLCBEZWMgMjAxNiIpJT4lDQogIA0KICBsYXlvdXQodGl0bGUgPSAnUklTRSBJTiBET0xMQVIgVkFMVUUgQUZURVIgUkVDRVNTSU9OICgyMDExLTIwMTYpRGF0YSAtIGNlbnN1cy5nb3YnLA0KICAgICAgICAgeGF4aXMgPSBsaXN0KHNob3dncmlkID0gVFJVRSksDQogICAgICAgICB5YXhpcyA9IGxpc3Qoc2hvd2dyaWQgPSBUUlVFKSwNCiAgICAgICAgIHNob3dsZWdlbmQgPSBGQUxTRSkNCg0KDQoNCmBgYA0KDQo=